// extensão da classe Array implementando padrão Singleton via Class.Occlude
// para atuar como History particularizado do S5M
Historia = new Class(
  {
    Extends: Array,

    Implements: Class.Occlude,

    initialize: function(property, element) {
      this.property = property || 'historia';
      this.element = $(element || document.body);
      if (this.occlude()) return this.occluded;
      this.saving = true;
    },

    registra: function(value) {
      if (this.saving) {
        this.push(value);
      } else {
        this.saving = true;
      }
      return value;
    },

    recupera: function(n) {
      var value = null;
      if (this.length && (n != 0)) {
        n = (this.length - (n || 1)).limit(0, this.length-1);
        value = this[n];
        this.splice(n);
        this.saving = false;
      }
      return value;
    }
  });

Element.implement (
  {
    setOpacity: function(value) { this.setStyle('opacity', value); return this },

    getOpacity: function() { return this.getStyle('opacity') }
  });

// classe de efeito pisca-pisca alternando opacidade de elemento
Fx.Blinker = new Class(
  {
    p:    null, // ponteiro para o objeto temporizador
    elm:  null, // elemento alvo do efeito pisca-pisca
    full: null, // opacidade inicial do elemento alvo

    // inicia imediatamente o efeito no elemento alvo
    initialize: function(elm, blinkTime) {
      this.elm = $(elm);
      var n = 5, tm = (blinkTime || 1000) / 2 / (n-1), x = [];
      x[0] = this.full = elm.getOpacity();
      x[n-1] = x[0] / n;
      for (var k = n--, u = x[n]; n > 1; k++, n--) x[k] = x[n-1] = x[n] + u;
      var f = function() { elm.setOpacity(x[ n++ % x.length ]) };
      this.p = f.periodical(tm);
    },

    // para o efeito restaurando a opacidade inicial do elemento
    stop: function() {
      clearInterval(this.p);
      this.p = null;
      this.elm.setOpacity(this.full);
    }
  });